#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include <ctime>

using namespace std;

 #define NUM 3
//#define NUM 5


// void* thread_run(void* args)
// {
// 	//静态类型转换
// 	const char* str = static_cast<const char*>(args);

// 	int cnt = 5;
// 	while(cnt)
// 	{
// 		cout << str << "is runing :" << cnt-- << "obtain self id->" << pthread_self() << endl;
// 		sleep(1);
// 	}

// 	//退出线程
// 	pthread_exit((void*)1);
// }	

// int main()
// {
// 	//创建线程
// 	pthread_t tid;
// 	pthread_create(&tid, nullptr, thread_run, (void*)"thread 1");

// 	//2秒后，中断线程
// 	// sleep(2);
// 	// pthread_cancel(tid);

// 	//等待线程
// 	void* ret = nullptr;
// 	pthread_join(tid, &ret);
	

// 	return 0;
// }

enum { OK=0, ERROR };

struct ThreadDate
{
	//构造
	ThreadDate(const string& name, pthread_t tid, time_t createTime, size_t top = 0)
		:_name(name), 
		_tid(tid), 
		_createTime((uint64_t)createTime),
		_status(OK),
		_top(top),
		_result(0)
	{}

	~ThreadDate(){}

	//成员变量
	//输入型参数
	string _name;
	pthread_t _tid;
	uint64_t _createTime; //创建时间
	//输出型参数
	int _status; //线程退出状态
	size_t _top;//累加到最大值
	int _result;
};

void *thread_run(void *arg)
{
	ThreadDate* tdate = static_cast<ThreadDate*>(arg);

	for(int i = 1; i <= tdate->_top; i++)
	{
		tdate->_result += i;
	}

	pthread_exit(static_cast<void*>(tdate));

	// char *name = (char *)arg;

	// while (true)
	// {
	// 	std::cout << "new thread running,thread name is:" << name << std::endl;
	// 	// exit(10);
	// 	sleep(5);
	// 	// break;
	// }

	// delete name; // 释放空间

	// pthread_exit((void*)1);
	// // return nullptr;
}

int main()
{

	// std::cout << sizeof(int*) << std::endl;
	// std::cout << sizeof(void*) << std::endl;

	pthread_t tids[NUM];
	for (int i = 0; i < NUM; i++)
	{
		// char thname[64];
		char *thname = new char[64];
		// snprintf(thname, sizeof(thname), "thread-%d", i + 1);
		snprintf(thname, 64, "thread-%d", i + 1);

		//定义ThreadDate类，传入到线程中
		ThreadDate* tdate = new ThreadDate(std::string(thname), i+1, time(nullptr), (100+ i * 5));

		// pthread_create(tids + i, nullptr, thread_run, tdate); // 创建线程池，将thname传参
		pthread_create(tids + i, nullptr, thread_run, tdate);// 创建线程池，将tdate传参
	}

	void *ret = nullptr; // 用于保存子线程退出的信息

	for (size_t i = 0; i < NUM; i++)
	{
		int n = pthread_join(tids[i], &ret); //传入ret指针的地址
		if(n != 0) std::cerr << "pthread_join error" << std::endl;

		ThreadDate* td = static_cast<ThreadDate*>(ret);
		if(td->_status == OK)
			cout << td->_name << " 计算的结果是: " << td->_result << " (它要计算的是[1, " << td->_top << "])" <<endl;
		
		//释放资源
		delete td;

		// std::cout << "子线程：thread->" << i+1 << "，退出码为：" << (uint64_t)ret << std::endl;
	}

	//等待线程
	//  for(size_t i = 0; i < NUM; i++)
	//  {
	//  	pthread_join(tids[i], nullptr);
	//  }

	//主进程
	//  while(true)
	//  {
	//  	std::cout << "main thread running" << std::endl;
	//  	sleep(1);
	//  }
	// sleep(3);

	return 0;
}

// void* thread_run(void* arg)
// {
//     while(true)
// 	{
// 		std::cout << "new thread running" << std::endl;
// 		sleep(1);
// 	}
// 	return nullptr;
// }

// int main()
// {
//     pthread_t t;

//     pthread_create(&t, nullptr, thread_run, nullptr);

//    //主进程
// 	while(true)
// 	{
// 		std::cout << "main thread running, new thread id:" << t << std::endl;
// 		sleep(1);
// 	}

//     return 0;
// }